package day0610

/**
  * @program: hadoop
  * @description: 视图界定 ，解决上下界问题
  * @author: Qiang.Ye
  * @date: 2019-06-12 06:56
  *
  *  上界和下界，规定上界和下界的范围
  *  eg: Int x   100<=x<=200
  *
  *  （*）规定泛型的取值范围
  *     eg:定义一个T，类的继承关系 A--->B--->C-->D  箭头指向子类
  *     可以规定T的取值范围   D <: T  <:  B
  *     T 的取值范围可以是 B C D
  *
  *   (*)定义：
  *     上界： s <: T  规定了S的类型必须是T的子类或是本身
  *     下界： u >: T  规定了U的类型必须是T的父类或是本身
  *
  **/
class  Vehicle{
  def drive() :Unit = println("Driving")
}
class  Car extends Vehicle{
  override def drive() :Unit = println("Car driving")
}
class  Bike extends Vehicle{
  override def drive() :Unit = println("Bike driving")
}


object UpperAndLowerBound {
  //定义驾驶交通工具的函数，规定上界是Vehicle
  def takeVehicle[T <: Vehicle](v:T) = v.drive()
  def main(args: Array[String]): Unit = {

    //定义交通工具
    var v : Vehicle = new Vehicle
    takeVehicle(v)

    var c : Car  = new Car
    takeVehicle(c)

    /**
      * 注意：不能传递其他类型 ，eg:takeVehicle("asfoasd")
      * 因为String不是V的类型
      */

    /**
      * 字符串类型的
      *
      * scala> def addTwoString[T<%String](x:T,y:T) = x+"###"+y
      * addTwoString: [T](x: T, y: T)(implicit evidence$1: T => String)String
      *
      * scala> addTwoString("hello","123")
      * res2: String = hello****123
      *
      * scala> addTwoString(1,2)
      * <console>:14: error: inferred type arguments [Int] do not conform to method addTwoString's type parameter bounds [T <: String]
      * addTwoString(1,2)
      * ^
      * <console>:14: error: type mismatch;
      * found   : Int(1)
      * required: T
      * addTwoString(1,2)
      * ^
      * <console>:14: error: type mismatch;
      * found   : Int(2)
      * required: T
      * addTwoString(1,2)

      * 解决：定义隐式转换函数，将int转换为String

      * 分析执行过程：
      * 1.调用int2String方法，把Int转换为String（Scala在后台调用，不需要显示）
      * 2.调用addTwoString方法，拼接字符串
      *
      * 隐式函数转换，不需要显示调用，它就能被调用
      *
      *
      */



  }
}
